今天要做一個文章元件 來處理點擊後顯示的頁面
咒語:幫我做一個文章顯示頁面元件 根據點擊的id 用Mui顯示 title 跟content
import React from "react";
import { Typography, Paper, Container } from "@mui/material";
const Article = ({ articleData, selectedArticleId, onBack }) => {
// 找到被選擇的文章
const selectedArticle = articleData.find(
(article) => article.id === selectedArticleId
);
if (!selectedArticle) {
return (
<Container maxWidth="md">
<Typography variant="h4">選擇一篇文章查看</Typography>
{selectedArticleId}
</Container>
);
}
return (
selectedArticleId && (
<Container maxWidth="md">
<Paper sx={{ padding: 3, marginTop: 3 }}>
<Typography variant="h4">{selectedArticle.title}</Typography>
<Typography variant="body1" sx={{ marginTop: 2 }}>
{selectedArticle.content}
</Typography>
</Paper>
</Container>
)
);
};
export default Article;
接下來要請他跟昨天的code合併
咒語:與上述code中 TableRow onClick={() => {點擊時切換成Article元件}
就會把昨天的code加入點擊後的邏輯
import React, { useState } from "react";
import {
AppBar,
Box,
Container,
CssBaseline,
Paper,
Tab,
Tabs,
Table,
TableBody,
TableCell,
TableContainer,
TableHead,
TableRow,
Typography,
TablePagination,
} from "@mui/material";
import Article from "../component/article";
const articleData = [
{
id: 1,
title: "React 學習指南",
content:
"React 是一個流行的前端 JavaScript 框架,本指南將幫助您入門 React 開發。",
},
{
id: 2,
title: "Vue.js 與狀態管理",
content:
"Vue.js 提供了簡單而有效的狀態管理機制,了解如何在 Vue.js 中管理應用程式的狀態。",
},
{
id: 3,
title: "JavaScript 非同步編程",
content:
"深入了解 JavaScript 中的非同步編程,包括 Promise、async/await 等技術。",
},
{
id: 4,
title: "前端性能優化技巧",
content: "優化前端性能是提供出色用戶體驗的關鍵,這裡介紹一些優化技巧。",
},
{
id: 5,
title: "Webpack 打包工具入門",
content: "Webpack 是一個功能強大的前端打包工具,這是一個入門指南。",
},
{
id: 6,
title: "前端安全性指南",
content: "保護前端應用程式的安全性至關重要,這是一個前端安全性指南。",
},
{
id: 7,
title: "TypeScript 入門教程",
content:
"TypeScript 是 JavaScript 的超集,了解如何使用 TypeScript 進行開發。",
},
{
id: 8,
title: "前端框架比較:React、Angular 和 Vue",
content: "比較 React、Angular 和 Vue 這三個主要前端框架的特點和優缺點。",
},
{
id: 9,
title: "响应式設計與 CSS 媒體查詢",
content: "學習如何使用 CSS 媒體查詢創建具有響應性的網頁設計。",
},
{
id: 10,
title: "前端測試技術總覽",
content: "了解前端測試技術,包括單元測試、集成測試和端對端測試。",
},
{
id: 11,
title: "鐵人賽精華",
content:
"「IT邦鐵人賽精華」是一個讓資訊科技專業人士分享他們的專業知識和經驗的平台。這個賽事每年都吸引著眾多的參與者,他們在各種主題下創作出高品質的文章和教學內容。參加IT邦鐵人賽不僅僅是一個展示您技術和專業知識的機會,還能夠與其他業界專家互動和學習。這個賽事有助於促進知識分享和技術交流,並有助於推動整個資訊科技社區的發展。無論您是一名軟件開發者、網站設計師、數據分析師還是任何其他IT領域的專業人士,IT邦鐵人賽都是一個展示您專業知識和技能的理想平台。不僅可以獲得證書和獎勵,還能夠建立寶貴的職業聯繫,並對整個行業做出貢獻。",
},
];
const Home = () => {
const [value, setValue] = useState(0);
const [page, setPage] = useState(0);
const [rowsPerPage, setRowsPerPage] = useState(10);
const [selectedArticleId, setSelectedArticleId] = useState(null);
const handleChangeTab = (event, newValue) => {
setValue(newValue);
};
const handleChangePage = (event, newPage) => {
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(parseInt(event.target.value, 10));
setPage(0);
};
const articlesToDisplay = articleData.slice(
page * rowsPerPage,
page * rowsPerPage + rowsPerPage
);
return (
<Container component="main" maxWidth="lg">
<CssBaseline />
{selectedArticleId ? (
<Article
selectedArticleId={selectedArticleId}
onBack={() => setValue(0)} // 添加一個返回函數,用於返回文章列表
articleData={articleData}
/>
) : (
<Box>
<AppBar position="static" color="default">
<Tabs
value={value}
onChange={handleChangeTab}
indicatorColor="primary"
textColor="primary"
variant="scrollable"
scrollButtons="auto"
aria-label="文章分類選擇"
>
<Tab label="最新" />
<Tab label="熱門" />
<Tab label="已解決" />
</Tabs>
</AppBar>
<Box>
{/* <Typography variant="h4" gutterBottom>
{value === 0 ? "最新文章" : value === 1 ? "熱門文章" : "已解決文章"}
</Typography> */}
<TableContainer component={Paper}>
<Table>
<TableHead>
{/* <TableRow>
<TableCell>文章標題</TableCell>
</TableRow> */}
</TableHead>
<TableBody>
{articlesToDisplay.map((article) => (
<TableRow
key={article.id}
hover
onClick={() => {
// 點擊文章時處理相應的操作,例如顯示文章內容
setSelectedArticleId(article.id);
}}
>
<TableCell>{article.title}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</TableContainer>
<TablePagination
rowsPerPageOptions={[10, 20, 50]}
component="div"
count={articleData.length}
rowsPerPage={rowsPerPage}
page={page}
onPageChange={handleChangePage}
onRowsPerPageChange={handleChangeRowsPerPage}
/>
</Box>
</Box>
)}
</Container>
);
};
export default Home;
發現還欠缺一個回去前頁的按鍵
這裡也請他生成
咒語 請用mui幫我生成一個返回按鍵含icon 並且使用onBack Fn
import React from 'react';
import { IconButton } from '@mui/material';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
const BackButton = ({ onBack }) => {
return (
<IconButton
onClick={onBack}
color="primary"
sx={{ '&:focus': { outline: 'none' } }} // 移除點擊時的黑色圓框
>
<ArrowBackIcon />
返回
</IconButton>
);
};
export default BackButton;
把上述元件塞入Article元件中 文章就暫時完成了